package com.xszx.server.service;

import com.alibaba.fastjson.JSON;
import com.xszx.server.dto.ResourceDto;
import com.xszx.server.entity.Resource;
import com.xszx.server.mapper.ResourceMapper;
import com.xszx.server.util.CopyUtil;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.List;

@Service
public class ResourceService {
    @javax.annotation.Resource
    private ResourceMapper resourceMapper;

    /**
     * zTree
     * 按约定将列表转成树
     * 要求：ID要正序排列
     * @return
     */
    public List<ResourceDto> getAllResources(){
        List<ResourceDto> resourceDtoList = CopyUtil.copyList(resourceMapper.findAll(),ResourceDto.class);
        //遍历循环字符结构(子--->父)
        for (int i = resourceDtoList.size() - 1; i >= 0; i--) {
            // 当前要移动的记录
            ResourceDto child = resourceDtoList.get(i);

            // 如果当前节点没有父节点，则不用往下了
            if (StringUtils.isEmpty(child.getParent())) {
                continue;
            }
            // 查找父节点
            for (int j = i - 1; j >= 0; j--) {
                ResourceDto parent = resourceDtoList.get(j);
                if (child.getParent().equals(parent.getId())) {
                    if (CollectionUtils.isEmpty(parent.getChildren())) {
                        parent.setChildren(new ArrayList<>());
                    }
                    // 添加到最前面，否则会变成倒序，因为循环是从后往前循环的
                    parent.getChildren().add(0, child);

                    // 子节点找到父节点后，删除列表中的子节点
                    resourceDtoList.remove(child);
                }
            }
        }
        return resourceDtoList;
    }

    /**
     * 重新添加资源到数据库
     * @param resourceStr
     * @return
     */
    @Transactional
    public void saveResources(String resourceStr){
        //将当前的字符串转换成
        List<ResourceDto> resourceDtos = JSON.parseArray(resourceStr,ResourceDto.class);
        //定义一个结婚存储全部的资源
        List<ResourceDto> resourceList = new ArrayList<>();
        for(ResourceDto resourceDto : resourceDtos){//保存最大父级资源
            add(resourceList,resourceDto);
        }
        //清空资源表
        resourceMapper.deleteAll();
        //将上面递归出来的资源添加到数据库
        for(ResourceDto resourceDto : resourceList){
            resourceMapper.insert(CopyUtil.copy(resourceDto,Resource.class));
        }
    }
    /**
     * 递归，将树型结构的节点全部取出来，放到list
     * @param list
     * @param dto
     */
    public void add(List<ResourceDto> list, ResourceDto dto) {
        list.add(dto);
        if (!CollectionUtils.isEmpty(dto.getChildren())) {
            for (ResourceDto d: dto.getChildren()) {
                d.setParent(dto.getId());
                add(list, d);
            }
        }
    }
    /**
     * 物理删除资源
     * @param id
     * @return
     */
    public int del(String id){
        return resourceMapper.deleteByPrimaryKey(id);
    }
     /**
     * 获取单个资源
     * @return
     */
    public Resource getResource(String id){
        return resourceMapper.selectByPrimaryKey(id);
    }
}
